﻿#define _CRT_SECURE_NO_WARNINGS 1
//#include <iostream>
//#include <assert.h>
//using namespace std;
////栈
//class Stack
//{
//public://访问限定符号 - 公有
//	//定义在类里面的成员函数默认为inline
//	//没加inline,默认前面也加了inline,
//	//但是默认加inline,这些函数也不一定是内联函数,还得看编译器
//	void Init(int capacity = 4)
//	{
//		_array = (int*)malloc(sizeof(int) * capacity);
//		if (nullptr == _array)
//		{
//			perror("malloc error!\n");
//			return;
//		}
//		_capacity = capacity;
//		_top = 0;
//	}
//	/*
//	这里不一样的是之前写的函数是全局的,命名通常都是STInit,STPush,
//	现在就不用那样写了,因为init和pus函数都是写在类里面的,受类域
//	的限制,所以init和push肯定是这个栈的,以前写全局Init前面加东西是
//	为了区分,假设还有队列呢,
//	*/
//	void Push(int x)
//	{
//		//判读空间是否足够 - 扩容
//
//		_array[_top++] = x;
//	}
//	int Top()
//	{
//		assert(_top > 0);
//		return _array[_top - 1];
//	}
//	void Destroy()
//	{
//		free(_array);
//		_array = nullptr;
//		_top = _capacity = 0;
//	}
//private://访问限定符 - 私有
//	//成员变量
//	//member - 成员
//	//成员变量前面或后面加_或者m开头,用于和形参区分,当然不加也可以
//	int* _array;
//	size_t _capacity;
//	size_t _top;
//};
//int main()
//{
//	//类名就是类型,不像结构体前面还要加struct,特别的麻烦
//	Stack st1;
//	//初始化栈
//	st1.Init();
//	//插入数据
//	st1.Push(1);
//	st1.Push(2);
//	st1.Push(3);
//	st1.Push(4);
//	//取栈顶元素
//	cout << st1.Top() << endl;
//	//销毁栈
//	st1.Destroy();
//	return 0;
//}
/*
类跟结构体不同的地方
1.类里面可以定义函数,这是最大的不同
2.用法上面前面不需要加class,直接用类名(类型),用类型定义对象,
而结构体需要加struct，
*/
/*
一个类,一般情况下,成员变量都是私有的,成员函数大部分都是公有的,
因为类的设计的时候不期望随便访问修改我的数据,调用方法就可以,其他不用管
*/
/*
类里面有成员变量,也有成员函数,不想直接在类外面访问的就定义成私有的
访问限定符限制的是类外面的访问,类的内部是不受影响的,
*/


/*
C++中struct也可以定义类,C++兼容C中的struct的用法,同时升级成了类,明显的
变化是struct中可以定义函数,一般情况下还是推荐用class类
*/
//struct Person
//{
////public:
//	void Init(const char* name, int age, const char* tel)
//	{
//		strcpy(_name, name);
//		_age = age;
//		strcpy(_tel, tel);
//	}
//	void Print()
//	{
//		cout << "姓名:" << _name << endl;
//		cout << "年龄:" << _age << endl;
//		cout << "电话:" << _tel << endl;
//	}
//一般情况下成员变量不期望在外面直接访问,看自己
//private:
//	char _name[10];
//	int _age;
//	char _tel[12];
//};

//C++中兼容C中struct的用法,********************************
//定义个队列
//typedef struct QueueNode
//{
//	struct QueueNode* next;
//	int val;
//}QNode;
//typedef struct Queue
//{
//	QNode* head;
//	QNode* tail;
//	int size;
//}Qu;
/*
struct在C++中有两套用法,一套就是像C++中这样,定义类,另一套就是像
C语言那样,定义结构体。这样用C写出的代码,C++也可以编译
*/
//****************************************************************

//void QueueInit(Qu* q)
//{
//	q->head = nullptr;
//	q->tail = nullptr;
//	q->size = 0;
//}
//
//int main()
//{
//	//类名就是类型
//	Person p1;
//	p1.Init("王浩", 20, "17309339146");
//	p1.Print();
//
//	//队列
//	Qu qu;
//	QueueInit(&qu);
//
//	return 0;
//}
/*
我们会发现用struct定义类的时候和用class定义类的时候是一摸一样的,
这就是C++对struct进行了升级,升级成了类,class可以的struct都可以
*/

//#include<iostream>
//using namespace std;
//
//class Queue
//{
//public:
//	void Init()
//	{
//
//	}
//};
//Stack和Queue不会初始化函数名字冲突,因为他们都是独立的作用域
//同一个域不能有同名变量,不同的域可以有同名变量
//#include"Stack.h"
//int main()
//{
//	Stack st;
//	st.Init();
//	return 0;
//}
//#include <iostream>
//using namespace std;
//class Date
//{
//public:
//	//Init看起来是3个参数,实际不是3个参数,前面还有一个
//	//void Init(Date* const this,int year, int month, int day)
//	void Init(int year, int month, int day)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//	//void Printf(Date* const this)
//	void Printf()
//	{
//		//this = nullptr;
//		//cout << this->_year << "/" << this->_month << "/" << this->_day << endl;
//		cout << _year << "/" << _month << "/" << _day << endl;
//	}
//private:
//	//这里是声明,没有开空间,这些变量是随着对象整体定义的
//	int _year;
//	int _month;
//	int _day;
//};
//////定义
////int year;
//////声明和定义不能用初始化去区分,声明和定义的特征就是有没有开空间
//int main()
//{
//	//类实例化出对象
//	Date d1;
//	Date d2;
//	//调用方法
//
//	//d1.Init(&d1,2024, 8, 7);
//	//d2.Init(&d1,2024, 8, 8);
//
//	d1.Init(2024, 8, 7);
//	d2.Init(2024, 8, 8);
//
//	//d1.Printf(&d1);
//	//d2.Printf(&d2);
//
//	d1.Printf();
//	d2.Printf();
//	return 0;
//}
/*
类和对象的关系是1对N,一个类可以实例化出N个对象
类就像一个房子的图纸一样,类里面不能存数据,就像
图纸里面不能住人,那么什么时候可以住人呢?用图纸
建造出很多房子就可以住人,一个图纸可以建造N栋房
子,那么我可以用一个类实例化出N个对象,类就像图
纸一样不能住人,但是这个类规定这个类实例化的对
象到底有哪些数据,有哪些方法,而图纸规定了到底是
几室几厅等。
*/


//#include<iostream>
//using namespace std;
// 计算⼀下A / B / C实例化的对象是多⼤？

//class A
//{
//public:
//	void Print()
//	{
//		cout << _ch << endl;
//	}
//private:
//	char _ch;
//	int _i;
//};
//class B
//{
//public:
//	void Print()
//	{
//		//...
//	}
//};
//class C
//{};
//int main()
//{
//	A a;
//	B b;
//	C c;
//	cout << sizeof(a) << endl;
//	cout << sizeof(b) << endl;
//	cout << sizeof(c) << endl;
//	cout << &b << endl;
//	cout << &c << endl;
//	return 0;
//}

//#include<iostream>
//using namespace std;
//class A
//{
//public:
//	void Print()
//	{
//		cout << "A::Print()" << endl;
//		cout << _a << endl;
//	}
//private:
//	int _a;
//};
//int main()
//{
//	A* p = nullptr;
//	p->Print();
//	return 0;
//}

